package spring_learn.a22;

/*
    目标: 如何获取方法参数名, 注意把 a22 目录添加至模块的类路径
        1. a22 不在 src 是避免 idea 自动编译它下面的类
        2. spring boot 在编译时会加 -parameters
        3. 大部分 IDE 编译时都会加 -g
 */
public class A22 {


    public static void main(String[] args) {
        /*
            学到了什么
                a. 如果编译时添加了 -parameters 可以生成参数表, 反射时就可以拿到参数名
                b. 如果编译时添加了 -g 可以生成调试信息, 但分为两种情况
                    1. 普通类, 会包含局部变量表, 用 asm 可以拿到参数名
                    2. 接口, 不会包含局部变量表, 无法获得参数名 (这也是 MyBatis 在实现 Mapper 接口时为何要提供 @Param 注解来辅助获得参数名)
         */

        /*
        ParameterNameDiscoverer接口，是用于获取方法上参数对应的参数名

        如果java代码在编译的过程中什么都不加，那么生成的class，无论是通过 反射/asm 是都不可以获得对应的参数名的

        如果加了-parameters进行编译，就会生成参数表，从而通过反射可以拿到参数名（springboot项目在编译时会加这个选项）
        如果加了-g，可以获得局部变量表，通过asm拿到对应参数名（但是有限制，如果是接口，就不会包含局部变量表，从而没办法得到参数名）（大多数编译器在编译时会加这个选项）

         */

        //具体例子可以看上面a22文件下Bean2.java里面的注释
    }
}
